VC 运行时库

C 运行时库

  • C 运行时库与平台相关
  • C 运行时库 = C 标准库 + 系统相关的库
  • 一个C 运行库大致包含了如下功能:
    • 启动与退出:包括入口函数及入口函数所依赖的其他函数等
    • 标准函数:由C语言标准规定的C语言标准库所拥有的函数实现(C标准库)
    • I/O:I/O功能的封装和实现,参见上一节中I/O初始化部分
    • 堆:堆的封装和实现,参见上一节中堆初始化部分
    • 语言实现:语言中一些特殊功能的实现
    • 调试:实现调试功能的代码
  • 早期的C Runtimes 并不支持动态链接库,但Visual C++ 4.0 之后已支持,并且在32 位操作系统中已不再有small/large 等内存模式之分。

VC 运行时库

  • 根据对运行时库的选择,一共有六种:
    • 静态链接
      • /ML –> Single-Threaded(static) –> libc.lib –> 自MSVC 2005 开始被删除
      • /MLd –> Debug Single-Threaded(static) –> libcd.lib –> 自MSVC 2005 开始被删除
      • /MT –> Multithreaded(static) –> libcmt.lib
      • /MTd –> Debug Multithreaded(static) –> libcmtd.lib
    • 动态链接
      • /MD –> Multithreaded DLL –> msvcrt.lib –> 依赖msvcrtxx.dll
      • /MDd –> Debug Multithreaded DLL –> msvcrtd.lib –> 依赖msvcrtdxx.dll
  • msvcrt.lib 是VC 运行时库的动态链接版本(/MD)的import 函数库,使用该链接库,程序执行时必须有msvcrtxx.dll

VC++ 运行时库

  • 只要程序中#include 了任何一个C++ 头文件,如iostreamfstream,MSVC 就会在链接阶段自动链接C++ 的运行时库
  • VC++ 运行时库有四个版本:
    • 静态链接
      • libcpmt.lib
      • libcpmtd.lib
    • 动态链接
      • msvcprt.lib –> 依赖msvcpxx.dll
      • msvcprtd.lib –> 依赖msvcpdxx.dll

Windows API

  • Windows 程序调用的函数可分为C Runtimes 以及Windows API 两大部分
  • Windows API,由操作系统本身(主要是Windows三大模块GDI32.DLL和USER32.DLL和KERNEL32.DLL)提供
  • 虽说动态链接是在执行时期才发生“链接”事实,但在链接时期,链接器仍需先为调用者(应用程序本身)准备一些适当的信息,才能够在执行时期顺利“跳”到DLL中执行。如果该API所属的函数库尚未加载,系统也才因此知道要先行加载该函数库。这些适当的信息放在所谓的import 函数库
  • Windows发展至今,逐渐加上的一些新的API函数并不放在GDI和USER和KERNEL三大模块中,而是放在诸如COMMDLG.DLL、TOOLHELP.DLL之中。如果要使用这些APIs,链接时还得加上这些DLLs所对应的import函数库,诸如COMDLG32.LIB和TH32.LIB

Windows 三大模块

  • import 函数库
    • GDI –> Gdi32.Lib
    • USER –> User32.Lib
    • KERNEL –> Kernel32.Lib
如果本文对你有所帮助,可以支持一下博主。